 #include<iostream>//poj3715 博客里面有说明

#define maxn  230
int n,m;
int g[maxn][maxn];
int a[maxn];

int fugai[maxn],visit[maxn],prex[maxn],prey[maxn];
void init()
{
	memset(g,0,sizeof(g));
	memset(a,0,sizeof(a));
	memset(prex,-1,sizeof(prex));
	memset(prey,-1,sizeof(prey));
	memset(fugai,0,sizeof(fugai));
}
int canx(int x)
{
	
	if(fugai[x]==1)	return 0;
	int i,j;
	for(i=0; i<n; i++)
	if(g[x][i] && visit[i]==0 && fugai[i]==0)
	{
		visit[i]=1;
		if(prey[i]==-1 || canx(prey[i]))
		{
			prex[x]=i;
			prey[i]=x;
			return 1;
		}
	}	
	return 0;
}
int cany(int y)
{
	
	if(fugai[y]==1)	return 0;
	int i,j;
	for(i=0; i<n; i++)
	if(g[y][i] && visit[i]==0 && fugai[i]==0)
	{
		visit[i]=1;
		if(prex[i]==-1 || cany(prex[i]))
		{
			prey[y]=i;
			prex[i]=y;
			return 1;
		}
	}	
	return 0;
}

void solve()
{
	int i,j,res=0;
	for(i=0; i<n; i++)
	if(a[i]==0)	//匈牙利之用从二分图的一边，搜索
	{
		memset(visit,0,sizeof(visit));
		res+=canx(i);
	}
	printf("%d",res);
	int x,y;
	for(i=0; i<n; i++)
	{
		if(a[i]==0)//覆盖集中的点可以是x的点也可以是y的点
		{
			if(prex[i]==-1)continue;//如果不是原来已经匹配的边
			y=prex[i];//从原来和他匹配的边找增广路
			prex[i]=-1;
			prey[y]=-1;
			fugai[i]=1;
			memset(visit,0,sizeof(visit));
			if(cany(y)==1)//如果找到增广路那么，这个点就不是覆盖集中的点
			{
				fugai[i]=0;
				//prex[i]=y;
				//prey[y]=i;
			}
			else
			printf(" %d",i);
		}
		else
		{
			if(prey[i]==-1)	continue;
			x=prey[i];
			prey[i]=-1;
			prex[x]=-1;
			fugai[i]=-1;
			memset(visit,0,sizeof(visit));
			if(canx(x)==1)
			{
				fugai[i]=0;
				//prey[i]=x;
				//prex[x]=i;
			}
			else
			printf(" %d",i);
		}
	}
	puts("");
}
int main()
{
#ifndef ONLINE_JUDGE
	freopen("in","r",stdin);
#endif
    int t,i,j,k;
	scanf("%d", &t);
	while(t--)
	{
		
		scanf("%d%d", &n,&m);
		init();
		int x,y;
		for(i=0; i<n; i++)
		{
			scanf("%d", &x);
			a[i]=x;	
		}
		for(i=0; i<m;i++)
		{
			scanf("%d%d", &x,&y);
			if(a[x]!=a[y])
			{
				if(a[x]==1)	swap(x,y);
				g[x][y]=1;//建图
				g[y][x]=1;
			}
		}
		solve();
	}
}

